﻿//#include <iostream>
//using namespace std;
////缺省函数
//void Func(int a = 0)
//{
//    cout << "a = " << a << endl;
//}
////全缺省
//void Func1(int a = 10, int b = 20, int c = 30)
//{
//    cout << "a = " << a << endl;
//    cout << "b = " << b << endl;
//    cout << "c = " << c << endl << endl;
//}
////半缺省函数缺省参数必须从右往左缺省
//void Func2(int a, int b = 20, int c = 30)
//{
//    cout << "a = " << a << endl;
//    cout << "b = " << b << endl;
//    cout << "c = " << c << endl << endl;
//}
///*void Func3(int a = 20, int b, int c = 30)
//{
//    cout << "a = " << a << endl;
//    cout << "b = " << b << endl;
//    cout << "c = " << c << endl << endl;
//}*/
//
//int main()
//{
//    //Func(1);//打印1
//    //Func();//打印 0
//    /*Func1();
//    Func1(1);
//    Func1(1, 2);
//    Func1(1, 2, 3);*/
//    Func2(100);
//    Func2(100, 200);
//    Func2(100, 200, 300);
//    return 0;
//}

//#include"Stack.h"
//int main()
//{
//	// 确定知道要插⼊1000个数据，初始化时⼀把开好，避免扩容
//	ST s1;
//	STInit(&s1, 1000);
//	//不知道需要多少空间
//	ST s2;
//	STInit(&s2);
//	return 0;
//}
//#include <iostream>
//using namespace std;
//int main()
//{
//	int a = 0;
//	int& b = a;
//	int& c = a;
//	int& d = a;
//	++d;
//	//都一样
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	cout << &d << endl;
//}
//void Swap(int* p1, int* p2)
//{
//	int tmp = *p1;
//	*p1 = *p2;
//	*p2 = tmp;
//}
//void Swap(int& rx, int& ry)
//{
//	int tmp = rx;
//	rx = ry;
//	ry = tmp;
//}
//int main()
//{
//	int a = 1, b = 2;
//	//指针
//	Swap(&a, &b);
//	//引用
//	Swap(a, b);
//}
//#include<iostream>
//#include<assert.h>
//using namespace std;
//typedef int STDataType;
//typedef struct Stack
//{
//	STDataType* a;
//	int top;
//	int capacity;
//}ST;
//void STInit(ST& rs, int n = 4)
//{
//	rs.a = (STDataType*)malloc(n * sizeof(STDataType));
//	rs.top = 0;
//	rs.capacity = n;
//}
//
//int main()
//{
//	// 调⽤全局的
//	ST st1;
//	STInit(st1);
//	
//	return 0;
//}
//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 10;
//	// 编译报错：“ra”: 必须初始化引⽤
//	//int& ra;
//	int& b = a;
//	int c = 20;
//	// 这⾥并⾮让b引⽤c，因为C++引⽤不能改变指向，
//	// 这⾥是⼀个赋值
//	b = c;
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	return 0;
//}
//#include<iostream>
//#include<assert.h>
//using namespace std;
//typedef int STDataType;
//typedef struct Stack
//{
//	STDataType* a;
//	int top;
//	int capacity;
//}ST;
//void STInit(ST& rs, int n = 4)
//{
//	rs.a = (STDataType*)malloc(n * sizeof(STDataType));
//	rs.top = 0;
//	rs.capacity = n;
//}
//// 栈顶
//void STPush(ST& rs, STDataType x)
//{
//	// 满了， 扩容
//	if (rs.top == rs.capacity)
//	{
//		printf("扩容\n");
//		int newcapacity = rs.capacity == 0 ? 4 : rs.capacity * 2;
//		STDataType* tmp = (STDataType*)realloc(rs.a, newcapacity *
//			sizeof(STDataType));
//		if (tmp == NULL)
//		{
//			perror("realloc fail");
//			return;
//		}
//		rs.a = tmp;
//		rs.capacity = newcapacity;
//	}
//	rs.a[rs.top] = x;
//	rs.top++;
//}
//// int STTop(ST& rs)
//int& STTop(ST& rs)
//{
//	assert(rs.top > 0);
//	return rs.a[rs.top];
//}
//int main()
//{
//	// 调⽤全局的
//	ST st1;
//	STInit(st1);
//
//	cout << STTop(st1) << endl;
//
//	STTop(st1) += 10;
//	
//	cout << STTop(st1) << endl;
//
//	return 0;
//}
//#include<iostream>
//using namespace std;
//int& func(int x, int y)
//{
//	int ret = x + y * 10;
//	return ret;
//}
//int main()
//{
//	func(1, 2) += 10;
//	return 0;
//}
#include<iostream>
using namespace std;
//int main()
//{
//	int a[10];
//	//越界读通常不报错
//	cout << a[10] << endl;
//	cout << a[11] << endl;
//	cout << a[12] << endl;
//
//	//抽查
//	//a[10] = 10;
//	//a[11] = 10;
//	//a[12] = 10;
//	//a[20] = 10;
//	return 0;
//}
//void func(const int& x)
//{
//
//}
//int main()
//{
//    const int a = 10;
//    // 编译报错：error C2440: “初始化”: ⽆法从“const int”转换为“int &”
//    // 这⾥的引⽤是对a访问权限的放⼤
//    //int& ra = a;
//    const int& ra = a;
//    //权限可以缩小不能放大
//    //缩小权限
//    int b = 20;
//    const int& rb = b;
//    //b++;//b的权限没有改变
//    //rb++; wrong
//
//    const int& rc = 30;
//
//    func(a);
//    func(b);
//    func(30);
//    return 0;
//}
//int main()
//{
//	int a = 0;
//
//	int& ref = a;
//	ref = 1;
//
//	int* ptr = &a;
//	*ptr = 2;
//	return 0;
//}
//#define ADD(a, b) ((a) + (b))
int ADD(int x, int y)
{
    int ret = x + y;
    return ret;
}
int main()
{
    int ret = ADD(1, 2);
    cout << ret << endl;
    return 0;
}



//